package com.itxiaowu.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itxiaowu.dao.DyRoleDao;
import com.itxiaowu.entity.PageResult;
import com.itxiaowu.pojo.Menu;
import com.itxiaowu.pojo.Permission;
import com.itxiaowu.pojo.Role;
import com.itxiaowu.service.DyRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = DyRoleService.class)
@Transactional
public class DyRoleServiceImpl implements DyRoleService {

    @Autowired
    private DyRoleDao dyRoleDao;

    //查询动态权限分页数据
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage, pageSize);
        Page<Permission> page = dyRoleDao.selectByCondition(queryString);
        return new PageResult(page.getTotal(),page.getResult());
    }
    //查询所有的权限信息和菜单信息
    @Override
    public Map<String, Object> findAllPermissionMenu() {
       List<Permission> permission=dyRoleDao.findAllPermission();
        List<Menu> menu=dyRoleDao.findAllMenu();
        Map<String, Object> map = new HashMap<>();
        map.put("menu", menu);
        map.put("permission", permission);
        return map;
    }

    //添加角色权限菜单
    @Override
    public void addRolePermissionMenu(Role role, Integer[] permissionIds, Integer[] menuIds) {
        //先添角色，根据角色获取id
        dyRoleDao.addRole(role);
        //根据角色的id添加每一个权限
        setRolePermission(role.getId(),permissionIds);
        //根据角色的id添加每一个菜单
        setRoleMenu(role.getId(),menuIds);
    }
    //根据角色id查询角色
    @Override
    public Role queryRoleById(Integer id) {
        Role role=dyRoleDao.queryRoleById(id);
        return role;
    }

    //根据角色id获取所有权限
    @Override
    public Integer[] findPermissionIdsById(Integer id) {
        Integer[] permissionIds=dyRoleDao.findPermissionIdsById(id);
        return permissionIds;
    }

    //根据角色id查询选中的所有菜单
    @Override
    public Integer[] findMenuIdsById(Integer id) {
        Integer[] menuIds=dyRoleDao.findMenuIdsById(id);
        return menuIds;
    }
    //修改角色信息
    @Override
    public void edit(Role role, Integer[] permissionIds, Integer[] menuIds) {
        //先根据角色id修改角色的信心
        dyRoleDao.editRole(role);
        //根据角色id删除它关联的权限表
        //根据角色id删除它菜单吧
        deletePermissionMenu(role.getId());

        //根据传进来的permission数组关联权限
        setRolePermission(role.getId(),permissionIds );
        //根据传进来的menuids数组关联权限
        setRoleMenu(role.getId(),menuIds );
    }
    //根据角色id删除角色
    @Override
    public void deleteRoleById(Integer id) {
        //先删除它的关联表
        deletePermissionMenu(id);
        //再删除它自己的表
        dyRoleDao.deleteRoleById(id);
    }

    //根据角色id删除它关联的权限表
    //根据角色id删除它菜单吧
    private void deletePermissionMenu(Integer id) {
        dyRoleDao.deletePermissionIds(id);
        dyRoleDao.deleteMenuIds(id);
    }

    //添加角色菜单关系
    private void setRoleMenu(Integer id, Integer[] menuIds) {
        //先判断数组是否为null
        if(menuIds!=null||menuIds.length>0){
            //创建一个map存数据
            Map map = new HashMap();
            for(Integer menuId:menuIds){
                map.put("role_id", id);
                map.put("menu_id",menuId);
                dyRoleDao.addRoleMenu(map);
            }
        }
    }
    //添加角色权限
    private void setRolePermission(Integer id, Integer[] permissionIds) {
        //先判断这个数组是否为null
        if(permissionIds!=null||permissionIds.length>0){
            //创建一个hashmap 存数据
            Map hashMap = new HashMap();
            for(Integer pid:permissionIds){
                hashMap.put("role_id",id );
                hashMap.put("permission_id",pid );
                dyRoleDao.addRolePermission(hashMap);
            }
        }
    }


}
